/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package JavaDictDBModel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

/**
 *
 * @author Christianto
 */
public class DBModelV2 {
    private Map<String, ArrayList<String>> kamus;
    private DBParser baca;
    private boolean balik;
    
    /**
     * Konstruktor untuk kelas DBModul
     * @param asal kode bahasa awal
     * @param sasar kode bahasa tujuan
     * @param tipe kode struktur data yang akan dipakai
     * 0 = Red Black Tree, pengembangan dari BST biasa, sehingga tinggi tree 
     *     dijamin maksimal 2*lg N.
     * 1 = HashMap, memakai hashing dari key yang diberikan, sehingga proses
     *     pencarian key diharapkan selesai dalam waktu konstan.
     */
    public DBModelV2(int asal, int sasar,int tipe) {
        baca = new DBParser(asal,sasar);
        if (tipe == 0) kamus = new TreeMap<String, ArrayList<String>>();
        else kamus = new HashMap<String, ArrayList<String>>();
        balik = (asal > sasar);
        int line = 0;
        
        ArrayList<String> dapat = baca.next();        
        while (!baca.isEOF()) {
            ++line;
            
            if (asal < sasar) {
                String kunci = dapat.get(0).substring(0,dapat.get(0).lastIndexOf("(")-1);
                ArrayList<String> tambah = kamus.get(kunci);
                if (tambah == null) tambah = new ArrayList<String>();
                
                if (!tambah.contains(dapat.get(1))) {
                    tambah.add(dapat.get(1));
                    kamus.put(kunci,tambah);
                    //System.gc();    
                }
            } else {
                String kunci = dapat.get(1).substring(0,dapat.get(1).lastIndexOf("(")-1);                
                ArrayList<String> tambah = kamus.get(kunci);
                if (tambah == null) tambah = new ArrayList<String>();
                
                if (!tambah.contains(dapat.get(0))) {
                    tambah.add(dapat.get(0));
                    kamus.put(kunci,tambah);
                    //System.gc();
                }          
            }
            dapat = baca.next();
            if (line % 50 == 0) System.gc();
        }
    }
    
    /**
     * menambahkan terjemahan dari kunci (arti) beserta tipenya ke dalam kamus
     * dan menuliskannya ke file
     * @param kunci sebuah string
     * @param tipe1 sebuah string
     * @param arti sebuah string
     * @param tipe2 sebuah string
     * 
     */
    
    public void DBInsert(String kunci, String tipe1, String arti, String tipe2) {
        kunci.replaceAll(";", ".");
        arti.replaceAll(";", ".");
        
        String hasil = arti+" ("+tipe2+")";
        ArrayList<String> tambah = kamus.get(kunci);
        if (tambah == null) tambah = new ArrayList<String>();
        
        if (tambah.contains(hasil) == false) {
            tambah.add(hasil);
            kamus.put(kunci, tambah);
            //System.gc();

            ArrayList<String> masuk = new ArrayList<String>();
            if (!balik) {
                masuk.add(kunci+" ("+tipe1+")");
                masuk.add(hasil);
            } else {
                masuk.add(hasil);
                masuk.add(kunci+" ("+tipe1+")");
            }
            baca.add(masuk);
        }
    }
    /**
     * Mencari suatu string ke database
     * @param kunci sebuah string
     * @return terjemahan dari kunci jika datanya ditemukan pada kamus,
     *         atau null jika data tidak ditemukan.
     */
    public ArrayList<String> DBSearch(String kunci) {
        return kamus.get(kunci);
    }
    
    /**
     * Mengecek apabila string ada di dalam database atau tidak
     * @param kunci sebuah string
     * @return true jika kunci ditemukan pada kamus 
     */
    
    public boolean isValueinDB(String kunci) {
        return kamus.containsKey(kunci);
    }
    
    /**
     * Mengembalikan seluruh isi kamus
     * @return seluruh kamus dalam strukturnya 
     */
    public SortedMap<String, ArrayList<String>> GetAll() {
        SortedMap<String, ArrayList<String>> urut = new TreeMap<String, ArrayList<String>>();
        urut.putAll(kamus);
        return urut;
    }
}
